package com.ruoyi.web.controller.util;

import com.ruoyi.framework.aspectj.LogAspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @author linxz
 * @since 2022-12-23 08:15
 */

public class ImageDownload {
    //上传文件存储路径
    public static String SAVE_PATH = "/home/files/engineai/config";

//    public static String SAVE_PATH = "/home/fileHome/images/";
//     public static String SAVE_PATH = "/root/home/image";

    private static final Logger log = LoggerFactory.getLogger(ImageDownload.class);


//   private static String SAVE_PATH = "/data/file_manager/";
    // private static final String SAVE_PATH = "/Users/linxz/Pictures/ztsh/";


    /**
     * 头像文件大小的上限值(50MB)
     */
    public static final int AVATAR_MAX_SIZE = 50 * 1024 * 1024;
    /**
     * 允许上传的头像的文件类型
     */
    public static final List<String> FILE_TYPES = new ArrayList<>();

    /** 初始化允许上传的头像的文件类型 */
    static {
        FILE_TYPES.add("image/jpeg");
        FILE_TYPES.add("image/png");
        FILE_TYPES.add("image/bmp");
        FILE_TYPES.add("image/gif");
        FILE_TYPES.add("image/webp");
        //视频类型
        FILE_TYPES.add("video/mp4");
        //音频
        FILE_TYPES.add("audio/ogg");

    }

    private ImageDownload(String savePath) {
        SAVE_PATH = savePath;
    }

    public static ImageDownload getInstance(String savePath) {
        return new ImageDownload(savePath);
    }

    /**
     * 文件下载到指定路径
     *
     * @throws Exception
     */
//    public HashMap<String,Object> download(String urlString, String type) throws IOException {
//        URL url = new URL(urlString);
//        URLConnection con = url.openConnection();
//        con.setConnectTimeout(20 * 1000);
//        String preName = "";
//        if ("0".equals(type)){
//            preName = "product/";
//        }else if ("1".equals(type)){
//            preName = "mini/";
//        }else{
//            preName = "oa/";
//        }
//        String fileName = System.currentTimeMillis()+"_"+RandomStringUtils.randomNumeric(5)+".jpg";
//        String filePath = SAVE_PATH + preName + fileName;
//        File sf = new File(filePath);
//        if (!sf.getParentFile().exists()) {
//            sf.getParentFile().mkdirs();
//        }
//        try (InputStream in = con.getInputStream();
//             OutputStream out = new FileOutputStream(filePath)) {
//            byte[] buff = new byte[1024];
//            int n;
//            while ((n = in.read(buff)) >= 0) {
//                out.write(buff, 0, n);
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        HashMap<String,Object> result = new HashMap<>();
//        result.put("fileName",fileName);
//        result.put("filePath",filePath);
//        result.put("fileUrl",preName + fileName);
//        result.put("fileSize",filePath.length());
//        return result;
//    }
//
//    public HashMap<String,Object> uploadByBase64(String base64,String type){
//
//        String dataPrix = "";
//        String data = "";
//        String [] d = base64.split("base64,");
//        if(d.length == 2){
//            dataPrix = d[0];
//            data = d[1];
//        }else{
//            throw new ApiException("上传失败，数据不合法");
//        }
//        String suffix = "";
//        if("data:image/jpeg;".equalsIgnoreCase(dataPrix)){
//            suffix = ".jpg";
//        } else if("data:image/x-icon;".equalsIgnoreCase(dataPrix)){
//            suffix = ".ico";
//        } else if("data:image/gif;".equalsIgnoreCase(dataPrix)){
//            suffix = ".gif";
//        } else if("data:image/png;".equalsIgnoreCase(dataPrix)){
//            suffix = ".png";
//        }else{
//            throw new ApiException("上传图片格式不合法");
//        }
//        String preName = "";
//        if ("0".equals(type)){
//            preName = "product/";
//        }else if ("1".equals(type)){
//            preName = "mini/";
//        }else{
//            preName = "oa/";
//        }
//        String fileName = System.currentTimeMillis()+"_"+RandomStringUtils.randomNumeric(5) + suffix;
//        log.info("生成文件名为："+fileName);
//        boolean success = decryptByBase64(data,SAVE_PATH+preName+fileName);
//        if (!success){
//            throw new ApiException("base64转图片失败");
//        }
//        HashMap<String,Object> result = new HashMap<>();
//        result.put("fileName",fileName);
//        result.put("filePath",SAVE_PATH+preName+fileName);
//        result.put("fileUrl",preName + fileName);
//        result.put("fileSize",getFileLength(SAVE_PATH+preName+fileName));
//        return result;
//    }
//
//    /**
//     * 输入转化后的base64和要生成的问文件位置
//     * @param base64
//     * @param filePath
//     * @return
//     */
//    public static  boolean decryptByBase64(String base64, String filePath) {
//        if (base64 == null && filePath == null) {
//            return false;
//        }
//        try {
//            File file =new File(filePath);
//            File fileParent=file.getParentFile();
//            if(!fileParent.exists()) {
//                fileParent.mkdirs();
//            }
//            byte[] bytes = Base64.decode(base64);
//
//            Files.write(Paths.get(filePath), bytes, StandardOpenOption.CREATE);
//            return true;
//        } catch (IOException e) {
//            e.printStackTrace();
//            return false;
//        }
//    }
//
//    public static long getFileLength(File file){
//        long fileLength = 0L;
//        if(file.exists() && file.isFile()){
//            fileLength = file.length();
//        }
//        return fileLength;
//    }
    public static long getFileLength(String filePath) {
        long fileLength = 0L;
        File file = new File(filePath);
        if (file.exists() && file.isFile()) {
            fileLength = file.length();
        }
        return fileLength;
    }


    public HashMap<String, Object> uploadByFile(MultipartFile file) {
        try {
            log.info("=====文件上传 staring...");
            // 判断上传的文件是否为空
            if (file.isEmpty()) {
                // 是：抛出异常
                log.error("文件上传失败，文件不能为空");
                throw new RuntimeException("文件不允许为空");
            }
            // 判断上传的文件大小是否超出限制值
            if (file.getSize() > AVATAR_MAX_SIZE) { // getSize()：返回文件的大小，以字节为单位
                // 是：抛出异常
                log.error("文件上传失败，超过限制:"+file.getSize());
                throw new RuntimeException("不允许上传超过" + (AVATAR_MAX_SIZE / 1024) + "KB的头像文件");
            }

            // 判断上传的文件类型是否超出限制
            String contentType = file.getContentType();
            // boolean contains(Object o)：当前列表若包含某元素，返回结果为true；若不包含该元素，返回结果为false
            if (!FILE_TYPES.contains(contentType)) {
                // 是：抛出异常
                log.error("文件上传失败，文件类型不正确:"+contentType);
                throw new RuntimeException("不支持使用该类型的文件作为头像，允许的文件类型：" + FILE_TYPES);
            }
            // 判断文件类型，图片或者视频
            String originalFilename = file.getOriginalFilename();
            String dirPath = "";
            if (originalFilename.endsWith(".png") || originalFilename.endsWith(".jpeg")
                    || originalFilename.endsWith(".jpg")) {
                dirPath = "image";
            } else if (originalFilename.endsWith(".mp4")) {
                dirPath = "mp4";
            } else if (originalFilename.endsWith(".ogg")) {
                dirPath = "audio";
            } else {
                throw new RuntimeException("不支持上传该类型文件");
            }

            //创建文件
            log.info("文件存储,文件夹地址："+SAVE_PATH + "/" + dirPath);
            // windows系统文件符号：\  Linux系统：/
//            File dir = new File(SAVE_PATH + "" + dirPath);

            File dir=new File(SAVE_PATH,dirPath);

            if (!dir.exists()) {
                dir.mkdirs();
            }
            // 保存的头像文件的文件名
            String suffix = "";
            int index = originalFilename.indexOf(".");
            if (index > 0) {
                //后缀名
                suffix = originalFilename.substring(index);
            }

            // 创建文件对象，表示保存的头像文件
            //+RandomStringUtils.randomNumeric(5)  "_"
            String fileName = System.currentTimeMillis() + suffix;
            //preName+
            File dest = new File(dir, fileName);
            log.info("文件存储,文件路径："+dest.getAbsolutePath());
            try {
                //保存文件到指定目录
                file.transferTo(dest);

            } catch (IllegalStateException e) {
                // 抛出异常
                log.info("文件存储,失败，文件异常");
                throw new RuntimeException("文件状态异常，可能文件已被移动或删除");
            } catch (IOException e) {
                // 抛出异常
                log.info("文件存储,失败，读写错误");
                throw new RuntimeException("上传文件时读写错误，请稍后重新尝试");
            }
            HashMap<String, Object> result = new HashMap<>();
            //preName  filePath文件路径
            result.put("fileUrl", dirPath + "\\" + fileName);
            log.info("文件存储,存储成功，存储路径为："+ dest.getAbsolutePath());
            return result;
        } catch (Exception e) {
            log.info("文件存储,存储失败!!!");
            e.printStackTrace();
            throw new RuntimeException("文件上传失败");
        }

    }


    public static void main(String[] args) throws Exception {
        String url = "http://api.jisuapi.com/barcode2/upload/202203/24125426_13326.jpg";
        // download(url,"0");
    }
}

